package com.wangdong.mijiqiqi.threetype.presenter;

import android.content.Context;
import android.view.View;
import android.widget.FrameLayout;


import com.wangdong.mijiqiqi.R;
import com.wangdong.wdbase.widget.ProgressWheel;


/**
 * Created by chenmeng on 2016/7/4.
 * 处理 布局在设置布局地下又套一层布局,来处理 没有网络 ,加载,有网络显示数据,加载失败,要显示的状态类处理
 */
public abstract class BaseNetView implements StateContract.StateView{

    private boolean bOnInterceptDisplay;//监听是否显示加载布局
    private FrameLayout loaded_data_container;//在新的Activity新添加的布局要放到这里面

    private ProgressWheel progressBar;//进度条view
    private View loaded_error_view;//错误view
    private Context mContext;//上下文
    private StateContract.StatePresenter presenter;//处理网络的presenter
    private View mContainerView;//加载布局底层+add后就是完整布局了

    /**
     * 初始化保留Context上下文对象
     * 并初始 加载 布局
     * */
    public BaseNetView(Context mContext) {
        this.mContext = mContext;
        setRootView();
    }

    public void setRootView() {
        mContainerView = View.inflate(mContext, R.layout.fragment_network_base, null);//初始化加载布局,分三层,一层是给子view设置显示,二层是显示没有网络时候的文字,三层是显示进度条的
        loaded_data_container = (FrameLayout)mContainerView.findViewById(R.id.flyt_fragment_container);//初始化加载数据的底层布局,也是设置布局和要显示数据的布局
        progressBar = (ProgressWheel)mContainerView.findViewById(R.id.progressBar);//加载布局圆形进度条
        loaded_error_view = mContainerView.findViewById(R.id.ll_network_error);//加载布局没有网络显示文字布局
        loaded_error_view.setOnClickListener(new View.OnClickListener() {//并给文字设置点击监听用于刷新数据
            @Override
            public void onClick(View v) {
                presenter.updateData();//刷新数据的
            }
        });
        loaded_data_container.addView((getChildRootView()));//添加设置Actiivty设置那个布局到 网络加载布局的第一层
    }

    @Override
    public View getRootView() {
        return mContainerView;
    }  //返回完整或可以说是和在一起的整个显示布局

    @Override
    public void setOnInterceptDisplay(boolean OnInter) {//设置监听显示
        bOnInterceptDisplay = OnInter;
    }

    @Override
    public void showLoadStatus(int state) {
        if (bOnInterceptDisplay) {//如果显示监听不是true,就结束往下走
            return;
        }
        switch (state) {
            case NetworkLoadStatus.LOAD_IDEL:
            case NetworkLoadStatus.LOAD_START://加载开始,
            	progressBar.setVisibility(bOnInterceptDisplay? View.GONE: View.VISIBLE);//如果显示监听返回来是true就隐藏进度条,反之显示进度条
                loaded_error_view.setVisibility(View.GONE);//加载错误隐藏
                showAndHideContainer(bOnInterceptDisplay?1:0);//如果显示监听是true就1显示,反之不显示
                break;
            case NetworkLoadStatus.LOAD_FAIL://加载失败
            case NetworkLoadStatus.LOAD_NETWORK_ERROR://没有网络
                showAndHideContainer(0);//设置布局也就是显示布局隐藏
                progressBar.setVisibility(View.GONE);//架子布局进度条隐藏
                loaded_error_view.setVisibility(View.VISIBLE);//加载错误布局显示
                break;
            case NetworkLoadStatus.LOAD_FINISH://加载数据开始
                showAndHideContainer(1);//显示数据布局
                progressBar.setVisibility(View.GONE);//隐藏进度条
                loaded_error_view.setVisibility(View.GONE);//加载错误布局隐藏
                break;
            default:
                break;
        }
    }

    /**
     * 设置处理者,也就是处理网络的类presentter
     * @param presenter
     */
    @Override
    public void setPresenter(StateContract.StatePresenter presenter) {
        this.presenter = presenter;
    }

    /**
     * 显示或者隐藏 container  设置布局也就是显示数据的布局  1是显示0是不显示
     * @param type 1显示
     */
    private void showAndHideContainer(int type) {// public_title
        View inner_container = loaded_data_container.findViewById(R.id.root);//记得把设置布局底id为root
        if(inner_container==null){
            throw new RuntimeException("你没有在布局中添加要隐藏和现实的container主布局");
        }
        if (type == 1) {
            inner_container.setVisibility(View.VISIBLE);
        } else {
            inner_container.setVisibility(View.GONE);
        }
    }

    /**
     * 网络加载状态常量
     */
    public static final class NetworkLoadStatus {

        public static final int LOAD_IDEL = 0;
        //开始加载
        public static final int LOAD_START = 1;
        //加载成功
        public static final int LOAD_FINISH = 2;
        //加载失败
        public static final int LOAD_FAIL = 3;
        //网络异常
        public static final int LOAD_NETWORK_ERROR = 4;
    }
}
